"""SQL搜索工具类"""
from pathlib import Path
from typing import Optional, List
from src.base.registry import bera

class SQLSearchUtils:
    """SQL搜索工具类"""

    # SQL文件搜索路径
    DEFAULT_SQL_SEARCH_PATHS = [
        'sql',
        'assets/sql',
        'docs/sql',
        '.'
    ]

    @classmethod
    def reset_search_paths(cls) -> None:
        """重置SQL文件搜索路径为空列表"""
        cls.DEFAULT_SQL_SEARCH_PATHS = []
        bera.logger.debug("重置SQL搜索路径")

    @classmethod
    def add_search_path(cls, path: str) -> None:
        """添加SQL文件搜索路径

        Args:
            path: 要添加的搜索路径
        """
        bera.logger.debug(f"添加搜索路径前的列表: {cls.DEFAULT_SQL_SEARCH_PATHS}")

        # 如果路径已存在,先删除
        if path in cls.DEFAULT_SQL_SEARCH_PATHS:
            cls.DEFAULT_SQL_SEARCH_PATHS.remove(path)
            bera.logger.debug(f"删除已存在的搜索路径: {path}")

        # 添加到列表末尾(后添加的优先级更高)
        cls.DEFAULT_SQL_SEARCH_PATHS.append(path)
        bera.logger.debug(f"添加搜索路径到末尾: {path}")
        bera.logger.debug(f"添加搜索路径后的列表: {cls.DEFAULT_SQL_SEARCH_PATHS}")

    @classmethod
    def get_sql_search_paths(cls) -> List[str]:
        """获取SQL文件搜索路径列表

        Returns:
            List[str]: 搜索路径列表
        """
        return cls.DEFAULT_SQL_SEARCH_PATHS

    @classmethod
    def find_sql_file(cls, table_name: str, search_paths: Optional[List[str]] = None) -> Optional[str]:
        """查找SQL文件

        Args:
            table_name: 表名
            search_paths: 搜索路径列表，如果为None则使用默认路径

        Returns:
            Optional[str]: SQL文件路径，如果未找到则返回None
        """
        # 获取搜索路径
        if search_paths is None:
            search_paths = cls.get_sql_search_paths()

        bera.logger.debug(f"当前搜索路径列表: {search_paths}")
        bera.logger.debug(f"查找表: {table_name}")

        # 从后向前搜索，因为后添加的路径在列表末尾，优先级更高
        for path in reversed(search_paths):
            bera.logger.debug(f"在目录 {path} 中搜索:")
            # 尝试不同的文件名模式
            file_patterns = [
                f"{table_name}.sql",
                f"table_{table_name}.sql",
                f"create_{table_name}.sql"
            ]

            for pattern in file_patterns:
                sql_file = Path(path) / pattern
                bera.logger.debug(f"检查文件: {sql_file}")
                if sql_file.exists():
                    bera.logger.debug(f"找到SQL文件: {sql_file}")
                    return str(sql_file)

        bera.logger.warning(f"未找到SQL文件: {table_name}")
        return None